/*
 ============================================================================
 * Archivo:   VentanaMenuCliente.cpp
 * Autor:     Martin Lucero
 ============================================================================
 */

#include "VentanaMenuCliente.h"

// Borra esto cuando no uses mas los std::cout
#include <iostream>
#include <vector>

#define RUTA_ICONO_VENTANA "../Recursos/diseñador_icono.png"

using namespace std;

VentanaMenuCliente::VentanaMenuCliente(Cliente* cliente) : _cliente(cliente) {
	set_title("Cerditos Furiosos - Menu");
//	set_default_icon_from_file(RUTA_ICONO_VENTANA);
	set_position(Gtk::WIN_POS_CENTER);

	selector_mundos.signal_changed().connect(sigc::mem_fun(*this, &VentanaMenuCliente::on_combo_mundos_changed));
	selector_mundos.set_focus_on_click(false);
//	selector_niveles.signal_changed().connect(sigc::mem_fun(*this, &VentanaMenuCliente::on_combo_niveles_changed));
//	selector_niveles.set_focus_on_click(false);
	
//	cargarMundosAlComboBox();

	Gtk::Label *etiqueta;

	etiqueta = Gtk::manage(new Gtk::Label("MENU PRINCIPAL", Gtk::ALIGN_CENTER));
	grilla.attach(*etiqueta, 0, 0, 2, 1);

	etiqueta = Gtk::manage(new Gtk::Label("Escoge un Mundo:", Gtk::ALIGN_CENTER));
	grilla.attach(*etiqueta, 0, 1, 1, 1);
	grilla.attach_next_to(selector_mundos, *etiqueta, Gtk::POS_RIGHT, 1, 1);

	etiqueta = Gtk::manage(new Gtk::Label("Escoge un Nivel:", Gtk::ALIGN_CENTER));
	grilla.attach(*etiqueta, 0, 2, 1, 1);
	grilla.attach_next_to(selector_niveles, *etiqueta, Gtk::POS_RIGHT, 1, 1);

	grilla.set_column_spacing(5);
	grilla.set_row_spacing(10);
	add(grilla);
	
	// Le pedimos los mundos al cliente y los cargamos en el combo box
	vector<string> vectorMundos = _cliente->getMundos();
	cargarMundosAlComboBox(vectorMundos);
	
	// Test
	on_combo_mundos_changed();
	
	/* Esto es una ventana basica. Vos desp le agregas algun boton para cargar el
	 * juego y abrir una nueva ventana, o lo que necesites. Todos los widgets que
	 * agregues, metelos como atributos privados de esta clase (y te recomiendo
	 * que no sean punteros con memoria dinamica, y en caso de serlos, desp borralos
	 * en el destructor. otra forma es con Gtk::Manage, pero si no la usaste, no
	 * pierdas tiempo entendiendola..) Todos los widgets tenes que agregarlos al
	 * gtk::Grid grilla que hice, con el metodo "attach". Mira los parametros que
	 * utiliza y lo entendes de toque */

	set_border_width(10);
	show_all_children();
}

VentanaMenuCliente::~VentanaMenuCliente() { }

/* Este metodo agrega los nombres de los mundos. Primero se deberian obtener
 * de la lista de mundos que recibis del servidor. */
void VentanaMenuCliente::cargarMundosAlComboBox(std::vector<std::string>& vectorMundos) {
	/* ALGO ASI: (std::vector<Mundo*> lista_mundos es un atributo miembro privado)
	 * ACLARACION: Ver si getListadoMundos te devuelve una copia del vector, un puntero, o una referencia, para saber si hay que eliminar memoria o no. Y averiguar si el operador "=" entre vectores hace copias de vectores!!
	 * 
	 * selector_mundos.remove_all();
	 * lista_mundos = servidor.getListadoMundos;
	 * for(unsigned i = 0; i < lista_mundos.size(); ++i) {
	 *		selector_mundos.append(lista_mundos[i].getNombre());
	 * }
	 */	
	selector_mundos.remove_all();
	std::vector<std::string>::iterator it = vectorMundos.begin();
	
	for(; it != vectorMundos.end(); ++it) {
		selector_mundos.append(*it);
	}
}

void VentanaMenuCliente::cargarNivelesAlComboBox(std::vector<std::string>& vectorMundos) {
	/* ALGO ASI: (std::vector<Nivel*> lista_niveles es un atributo miembro privado)
	 * ACLARACION: Ver si getListadoNiveles te devuelve una copia del vector, un puntero, o una referencia, para saber si hay que eliminar memoria o no. Y averiguar si el operador "=" entre vectores hace copias de vectores!!
	 *
	 * lista_niveles = lista_mundos.find(nombreMundo).getListaNiveles(); // O SEA, ACA TENES QUE BUSCAR EN LA LISTA MUNDOS EL MUNDO DE DICHO NOMBRE Y SACARLE SU LISTA DE NIVELES. FIJARSE EN "vector" METODOS DE BUSQUEDA
	 * 
	 * selector_niveles.remove_all();
	 * for(unsigned i = 0; i < lista_niveles.size(); ++i) {
	 *		selector_niveles.append(lista_niveles[i].getNombre());
	 * }
	 */
	selector_niveles.remove_all();
	std::vector<std::string>::iterator it = vectorMundos.begin();
	
	for(; it != vectorMundos.end(); ++it) {
		selector_niveles.append(*it);
	}
	
	// ESTO ES PARA PROBAR...
//	selector_niveles.remove_all();
//	selector_niveles.append(Glib::ustring(nombreMundo + ": Nivel 1"));
//	selector_niveles.append(Glib::ustring(nombreMundo + ": Nivel 2"));
//	selector_niveles.append(Glib::ustring(nombreMundo + ": Nivel 3"));
}

/* Handler de cuando se elige una nueva entrada en el combo box del mundo. Aca tendrias
 * que llamar a "cargarNivelesAlComboBox" ogido, y hacer los append como
 * se hizo aca, pero en el combo box de niveles */
void VentanaMenuCliente::on_combo_mundos_changed() {
//	cargarNivelesAlComboBox(selector_mundos.get_active_text());
	
	// Esto es para que te des cuenta de cuando se activa el handler, desp sacalo
//	std::cout << "on_combo_mundos_changed(): Text=" << selector_mundos.get_active_text() << std::endl;
	string mundoSeleccionado = selector_mundos.get_active_text();
	vector<string> nivelesMundoSeleccionado = 
			_cliente->getNiveles(mundoSeleccionado);
	
	// Cargamos los niveles al ComboBoxText
	cargarNivelesAlComboBox(nivelesMundoSeleccionado);	
}

/* Aca es cuando elegis un nivel. No deberia hacer nada particular...xq deberia
 * un boton en la ventana del menu que diga "EMPEZAR" o algo asi */
//void VentanaMenuCliente::on_combo_niveles_changed() {
//	// SIRVE?
//	
//	
//	// Esto es para que te des cuenta de cuando se activa el handler, desp sacalo
////	std::cout << "on_combo_niveles_changed(): Text=" << selector_niveles.get_active_text() << std::endl;
//}